package com.yc.baseapi;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
 * Scanner 是java5新增是内容，用于处理用户输出内容
 * @author yc
 *
 */
public class TestScanner {
	
	/**
	 * 简单接受用户的输入字符串
	 * next()只会接收回车之前，第一个空格前的内容
	 */
	public void m1() {
		System.out.println("----1-----");
		Scanner sn = new Scanner(System.in);
		System.out.println("----2-----");
		String str = sn.next();
		System.out.println("----3-----");
		System.out.println("用户输入的字符：" + str);
		sn.close();
	}
	
	/**
	 * nextLine可以接受一行（回车前的所有字符）
	 */
	public void m2() {
		Scanner sn = new Scanner(System.in);
		String str = sn.nextLine();
		System.out.println("用户输入的字符：" + str);
		sn.close();
	}
	
	/**
	 * 接收一个整数
	 */
	public void m3() {
		Scanner sn = new Scanner(System.in);
		System.out.print("用户输入的整数是：");
		if (sn.hasNextInt()) {
			System.out.println(sn.nextInt());
		} else {
			System.out.println("输入的不是整数");
		}
		sn.close();
	}
	
	/**
	 * 接收一个浮点数
	 */
	public void m4() {
		Scanner sn = new Scanner(System.in);
		System.out.println("用户输入的浮点数是：");
		if (sn.hasNextFloat()) {
			System.out.println(sn.nextFloat());
		} else {
			System.out.println("输入的不是浮点数");
		}
		sn.close();
	}
	
	/**
	 * 循环接收输入，打印5个数字才结束
	 */
	public void m5() {
		Scanner sn = new Scanner(System.in);
		List<Integer> list = new ArrayList<Integer>();
		System.out.println("请输入整数：");
		while (list.size() < 5) {//while条件是我们自己定义的，就有结束的时刻
			if (sn.hasNextInt()) {
				list.add(sn.nextInt());
			} else {
				System.out.println("请输入整数!");
				sn.next();//必须把缓存里的东西取出来，否则会死循环一直进入else里
			}
		}
		
		System.out.print("您输入的" + list.size() + "个数字为：");
		System.out.println(list.toString());
		sn.close();
	}
	
	/**
	 * hasnext 和 while 的结合（在不停止接收任务的程序设计中很常见是，比如servlet接收http请求）
	 */
	public void m6() {
		Scanner sn = new Scanner(System.in);
		List<Integer> list = new ArrayList<Integer>();
		
		//这个其实是阻塞，直到有数据才会往下走，结合while就会产生一个奇妙的效果：
		//类似死循环的效果：没有数据就阻塞（并不会马上返回数据），有数据就进入循环体。
		//也就是说hasNext不会返回false
		while(sn.hasNext()) {//
			if (sn.hasNextInt()) {
				list.add(sn.nextInt());
			} else {
				sn.next();//如果不是，则跳过
			}
			System.out.println(list.toString());
		}
		
		sn.close();
	}
	
	public void m7() {
		Scanner sn = new Scanner(System.in);
        
        while(sn.hasNext()) {
            String line = sn.nextLine();
            String[] strArr = line.split(" ");
            int sum = 0;
            for (int i = 0; i < strArr.length; i ++) {
                sum += Integer.parseInt(strArr[i]);
            }
            System.out.print(sum);
        }
        
        sn.close();
	}
	
	public void m8() {
		Scanner sn = new Scanner(System.in);
        int n = sn.nextInt();
        String line = sn.nextLine();//这一行在搞什么？ 为什么第二次获取行 首先得到但是一个空？
        System.out.println(line);
        String[] strArr = sn.nextLine().split(" ");
        List<String> list = new ArrayList<>();
        for (int i = 0; i < n; i ++) {
            list.add(strArr[i]);
        }
        list.sort((a, b) -> {
            return a.compareTo(b);
        });
        String spt = "";
        for (String s : list) {
            System.out.print(spt + s);
            spt = " ";
        }
        sn.close();
	}
	
	public void testLine() {
		Scanner sn = new Scanner(System.in);
		System.out.println(sn.nextLine());
		System.out.println(sn.nextLine());
		System.out.println(sn.nextLine());
		System.out.println(sn.nextLine());
		sn.close();
	}
	
	/**
	 * nextInt 输出的会在最后再输出一次，即是结束的判断条件，也是最后一次输出的内容“空”
	 */
	public void testLine2() {
		Scanner sn = new Scanner(System.in);
		System.out.println(sn.nextInt());
		
		System.out.println(sn.nextLine());//这一行 在第一次回车输出数字后 自动执行，输出的是“”
		System.out.println(sn.nextLine());
		System.out.println(sn.nextLine());
		System.out.println(sn.nextLine());
		sn.close();
	}
	
	public void testLine3() {
		Scanner sn = new Scanner(System.in);
		System.out.println(sn.nextInt());
		System.out.println(sn.nextInt());
		
		System.out.println(sn.nextLine());//这一行 在第一次回车输出数字后 自动执行，输出的是“”
		System.out.println(sn.nextLine());
		System.out.println(sn.nextLine());
		System.out.println(sn.nextLine());
		sn.close();
	}
	
	public void m9() {
		Scanner sn = new Scanner(System.in);
        while (sn.hasNextLine()) {
            String[] txtArr = sn.nextLine().split(" ");
            Arrays.sort(txtArr);
            String spt = "";
            for (String s : txtArr) {
                System.out.print(spt + s);
                spt = " ";
            }
            
        }
        sn.close();
	}
	
	public void m10() {
		Scanner sn = new Scanner(System.in);
        while (sn.hasNext()) {
            System.out.println(sn.nextInt() + sn.nextInt());
        }
        sn.close();
	}
	
	public void mc1() {
		Scanner sn = new Scanner(System.in);
        
        List<String> result = new ArrayList<String>();
		
		String[] names = sn.nextLine().split("\\/");
		for (int i = 0; i < names.length; i++) {
			String itemName = names[i];
			if (!itemName.equals(".") && !itemName.equals("..")) {
				result.add(itemName);
				continue;
			}
			if (itemName.equals(".")) {
				continue;
			}
			if (itemName.equals("..")) {
				result.remove(result.size()-1);
			}
					
		}
		
		String spt = "";
		for (String name : result) {
			System.out.print(spt + name);
			spt = "/";
		}
		
		sn.close();
	}
	
	public void mc2() {
		System.out.println((int)'a');
	}
	
	public void mc3() {
		Scanner sn = new Scanner(System.in);
		int num = sn.nextInt();
		sn.nextLine();
		
		
		Map<String, Set<String>> map = new HashMap<>();
		map.put("pkgA", new HashSet<String>());
		map.put("pkgB", new HashSet<String>());
		map.put("pkgC", new HashSet<String>());
		map.put("pkgD", new HashSet<String>());
		
		for (int i = 0; i< num; i ++) {
			String first = sn.next();
			String secode = sn.next();
			map.get(secode).add(first);
		}
		
		Set<String> rA = getItem(map, "pkgA");
		rA.remove("pkgA");
		Set<String> rB = getItem(map, "pkgB");
		rB.remove("pkgB");
		Set<String> rC = getItem(map, "pkgC");
		rC.remove("pkgC");
		Set<String> rD = getItem(map, "pkgD");
		rD.remove("pkgD");
		
		String[] ar = {"pkgA", "pkgB", "pkgC", "pkgD"};
		int[] numar = {rA.size(), rB.size(), rC.size(), rD.size()};
		int maxIndex = getMaxIndexFromArr(numar);
		System.out.println(ar[maxIndex]);
		sn.close();
		
	}
	
	public int getMaxIndexFromArr(int[] arr) {
		int maxIndex = 0;
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] > arr[maxIndex]) {
				maxIndex = i;
			}
		}
		return maxIndex;
	}
	
	public Set<String> getItem(Map<String, Set<String>> map, String key) {
		Set<String> result = new HashSet<String>();
		if (map.get(key).size() > 0) {
			for (String child : map.get(key)) {
				result.addAll(getItem(map, child));
			}
			result.add(key);
		} else {
			result.add(key);
		}
		return result;
	}
	
	

	public static void main(String[] args) {
		TestScanner ts = new TestScanner();
//		ts.m1();
//		ts.m2();
//		ts.m3();
//		ts.m4();
//		ts.m5();
//		ts.m6();
//		ts.m7();
//		ts.m8();
//		ts.testLine();
//		ts.testLine2();
//		ts.testLine3();
//		ts.m9();
//		ts.m10();
//		ts.mc1();//"a/b/../c/./d"
//		ts.mc2();
		ts.mc3();

	}

}
